//可以引用每个预制件的脚本
const Number = require('Number');

cc.Class({
    extends: cc.Component,

    properties: {
        batteryNode:[cc.Node],//定义7个炮

        //背景
        bg:cc.Sprite,

        //炮台的父节点
        battery:cc.Node,
        maxAngle:70,
        minAngle:-70,
        //子弹
        bulletFab:cc.Prefab,

        //金币控制
        //定义多个预制件的脚本数组，number[0]:表示第一个预制件的脚本，既最高位的Number脚本
        number:[Number],

        //多种鱼类的预制件
        fishFab:[cc.Prefab],

        //所有金币的父节点
        goldParent:cc.Node,

      
    },

  
    onLoad: function () {
        //碰撞管理器
        var manager=cc.director.getCollisionManager();
       manager.enabled=true;
    
        this.batteryCurrentIndex=0; //显示当前炮台的编号

        this.bg.node.on("touchstart",this.rotateBattery.bind(this))

        //每发炮弹的冷却时间都不相同，炮弹越大，冷却时间越长，刚开始需要炮弹的冷却时间大于累加的时间，因为第一次需要立马发射子弹
        this.coolTime=0;

        //时间的累加，当时间累加大于等于对应炮弹的冷却时间的时候，就发射炮弹
        this.addTime=0;

        //将金币显示为当前的金币数
         this.gold= 9999;

         //将金币数初始化显示
         this.str = this.gold + "";

        //  cc.log(this.str.length);
         if(this.str.length < 4)
         {
             var s="0000";
             this.str = s.substr(0,s.length-this.str.length)+this.str;
         }

         for(let i=0;i<this.number.length;i++)
         { 
            //执行每个脚本里的初始化函数，就是将每个脚本里面的两个标签赋初始值
            this.number[i].init(this.str[i]);
            
         }

         //鱼类生成
         this.schedule(this.swapFish.bind(this),1);

        
        
    },
   
    update: function (dt) {

        this.addTime +=dt;
    },
    //切换大小炮弹
    changeBattery:function(event,customData){

        this.batteryCurrentIndex += (customData ==="1"?1:-1);

        if(this.batteryCurrentIndex>=7)
        {
            this.batteryCurrentIndex=0;
        }
        if(this.batteryCurrentIndex<0)
        {
            this.batteryCurrentIndex=6;
        }

        //将炮弹的冷却时间初始化
        this.coolTime=0;
       

        for(let i=0;i<this.batteryNode.length;i++)
        {
            if(i===this.batteryCurrentIndex)
            {
                this.batteryNode[i].active=true;
                //添加帧动画
                this.batteryNode[i].getComponent(cc.Animation).play();       
            }
            else
            {
                this.batteryNode[i].active=false;
            }
        }


    },
    //炮弹旋转，子弹生成，飞出，金币减少
    rotateBattery:function(touch,event){

         //点击一下就播放动画
         this.batteryNode[this.batteryCurrentIndex].getComponent(cc.Animation).play();

        //炮弹随鼠标点击则转向：

       //将世界坐标系转换为节点内的坐标系，点击的坐标就是世界坐标系
        var nowTouch = this.battery.convertTouchToNodeSpaceAR(touch);
        // cc.log(nowTouch);
        //转弧度  atan(反切)--->转换了反切的弧度
        var rad = Math.atan(nowTouch.x/nowTouch.y);
        //弧度转角度
        var angle= rad*180/Math.PI;
        // cc.log(angle);
        if(nowTouch.y>0 && angle<=this.maxAngle && angle>=this.minAngle)
        {
            this.batteryNode[this.batteryCurrentIndex].rotation=angle;
            this.batteryCurrentRotation=angle;
        }


        //子弹生成并伴有冷却时间：

        //设置当前炮弹的冷却时间
        this.coolTime=this.batteryCurrentIndex*0.1;
        //如果累加的时间到了冷却的时间，就发射子弹
        if(this.addTime >= this.coolTime && this.gold>=(this.batteryCurrentIndex+1)*10)
        {
            //生成子弹
            var bullet = cc.instantiate(this.bulletFab);
            //将子弹绑定到与炮筒相同的层级上
            cc.find("Canvas/bg/bar/battery").addChild(bullet);
            //弧度转换为向量，cc.pForAngle(弧度),返回的是一个向量，第一个参数是角度的cos值，第二个是角度的sin值;以1为斜边的计算角度
            var bulletRotate = cc.pForAngle(this.batteryCurrentRotation/180*Math.PI);

            //设置炮弹的坐标，始终在炮弹口上
            bullet.setPosition(36*bulletRotate.y,36*bulletRotate.x);

            //设置子弹的皮肤与自身角度，及速度及
            //将子弹发射出来时候的角度相对于炮筒的角度，与炮筒的角度一致？
            bullet.getComponent("Bullet").init(this.batteryCurrentIndex+1,this.batteryCurrentRotation,5);

            this.addTime=0;
            
        }
        //点击一下背景，分数变化：

         //每点击一下背景就调用各自Number脚本里面的滚动函数；change函数里面调用滚动函数
         this.change();
    },
    change:function(){


        if(this.gold>=(this.batteryCurrentIndex+1)*10)
        {
             //点击屏幕金币减少,参数：数组下标
            this.gold-=(this.batteryCurrentIndex+1)*10;
        }
      
       
       //将减少后的金币值，重新转换为字符串传递
       this.str = this.gold + "";
       if(this.str.length<4)
       {
           var s="0000";
           this.str = s.substr(0,s.length-this.str.length)+this.str;
       }
       
       for(let i=0;i<this.number.length;i++)
       {
            if(this.str[i]!==this.number[i].canSeeNum)
            {
                //执行每个脚本里的滚动函数，看看当前str中显示的数据
                this.number[i].onBoardRoll(this.str[i]);
            }
         
       }

       if(this.gold<(this.batteryCurrentIndex+1)*100)
       {
           //点击一下就播放动画
           this.batteryNode[this.batteryCurrentIndex].getComponent(cc.Animation).pause();
           this.unschedule(this.onLoad,this);
       }
   },

   swapFish:function(){
     var type = parseInt(Math.random()*this.fishFab.length);
    //  var type = 0;
     var fish=cc.instantiate(this.fishFab[type]);
     //控制鱼的位置在左边还是右边
     var isleft=Math.random()<0.5?-1:1;

     //添加预制件鱼实例化后的节点到舞台并返回该节点及父类对象
    var fishNode= window.Global.getClassAndAdd(this.fishFab[type],"Fish",cc.find("Canvas/bg/bar/battery"),(cc.winSize.width/2+50+fish.width)*isleft,284);

    // fishNode.anchorX=1;
    // fishNode.anchorY=0.5;
    //fishNode返回的是两个参数，一个参数tNode是当前节点，一个参数tClass是当前节点绑定的脚本，调用脚本里面的函数
    fishNode.tClass.fishAction(type,isleft);

   }



});
